package com.telecom.service;

import com.telecom.common.convention.result.PageDTO;
import com.telecom.pojo.dto.admin.order.AdminOrderPageQueryRequestDTO;
import com.telecom.pojo.dto.admin.order.OrderCancelRequestDTO;
import com.telecom.pojo.dto.user.order.OrderPageQueryRequestDTO;
import com.telecom.pojo.dto.user.order.OrderPaymentRequestDTO;
import com.telecom.pojo.vo.admin.order.AdminOrderDetailVO;
import com.telecom.pojo.vo.admin.order.AdminOrderItemVO;
import com.telecom.pojo.vo.admin.order.RefundRecordVO;
import com.telecom.common.convention.result.PageQuery;
import com.telecom.pojo.vo.user.order.OrderDetailVO;
import com.telecom.pojo.vo.user.order.OrderItemVO;
import com.telecom.pojo.vo.user.order.OrderPickupCodeVO;
import jakarta.validation.Valid;
import jakarta.validation.constraints.Positive;

/**
 * 订单业务接口
 */
public interface OrderService {

    /**
     * 管理端订单分页查询
     * 
     * @param queryRequest 查询参数
     * @return 订单列表分页结果
     */
    PageDTO<AdminOrderItemVO> pageQuery(AdminOrderPageQueryRequestDTO queryRequest);

    /**
     * 根据订单ID查询订单详情
     * 
     * @param id 订单ID
     * @return 订单详情
     */
    AdminOrderDetailVO getOrderDetails(Long id);

    /**
     * 根据订单号确认取餐
     * 
     * @param orderNumber 订单号
     */
    void confirmPickup(String orderNumber);

    /**
     * 取消订单并处理退款
     * 
     * @param cancelRequest 取消订单请求参数
     */
    void cancelOrder(OrderCancelRequestDTO cancelRequest);

    /**
     * 退款记录分页查询
     * 
     * @param pageQuery 分页参数
     * @return 退款记录列表分页结果
     */
    PageDTO<RefundRecordVO> getRefundPage(PageQuery pageQuery);

    /**
     * 根据套餐id和用户id创建订单
     * @param mealId
     * @param userId
     */
    Long createOrder(Long mealId, Long userId);

    /**
     * 用户主动取消订单
     * @param id
     */
    void userCancelOrder(@Positive(message = "订单ID必须为正数") Long id);

    /**
     * 用户更新订单支付状态，同时更新取餐方式和备注
     * @param paymentRequest 支付请求参数
     */
    void updateOrderPayStatus(@Valid OrderPaymentRequestDTO paymentRequest);

    /**
     * 用户用餐评价
     * @param id
     * @param isSatisfied
     */
    void rating(long id, boolean isSatisfied);

    /**
     * 用户端订单分页查询
     * @param queryRequest
     * @return
     */
    PageDTO<OrderItemVO> userPageQuery(@Valid OrderPageQueryRequestDTO queryRequest);

    /**
     * 根据订单id返回订单号和取餐码地址
     * @param id
     * @return
     */
    OrderPickupCodeVO getOrderPickupCode(@Positive(message = "订单ID必须为正数") Long id);

    /**
     * 根据订单id返回订单详情
     * @param id
     * @return
     */
    OrderDetailVO getUserOrderDetails(@Positive(message = "订单ID必须为正数") Long id);
}